package com.hzw.saas.api.hpc;

import com.hzw.saas.api.hpc.bo.*;
import com.hzw.saas.api.hpc.enums.HpcAccountPoolStatus;
import com.hzw.saas.api.hpc.query.HpcAccountRecordQuery;
import com.hzw.saas.api.hpc.query.HpcAccountRenewalQuery;

import java.util.Date;
import java.util.List;

/**
 * <p>
 *
 * </p>
 *
 * @author sonam
 * @since 2021/5/11 15:11
 */
public interface IHpcAccountRecordService {

    /**
     * 获取所有列表
     *
     * @return
     */
    List<HpcAccountRecordBo> getList();

    HpcAccountRecordBo get(String pid);

    HpcAccountRecordBo add(HpcAccountRecordQuery accountRecordQuery);

    /**
     * 模糊查询recordId，通过hpc账号名称
     *
     * @param hpcAccount
     * @return
     */
    List<String> listByLikeHpcAccountName(String hpcAccount);

    /**
     * 获取超算帐号状态
     *
     * @param hpcAccountId
     * @return
     */
    HpcAccountPoolStatus getHpcAccountStatus(String hpcAccountId);

    /**
     * 续费
     *
     * @param hpcAccountRenewalQuery
     */
    void renewHpcAccountUser(HpcAccountRenewalQuery hpcAccountRenewalQuery);

    /**
     * 通过hpcAccountId获取没有解绑的Record信息
     *
     * @param hpcAccountId
     * @return
     */
    HpcAccountRecordBo searchOneByHpcAccountId(String hpcAccountId);

    /**
     * 解绑hpcAccountRecord记录（仅仅改变status以及过期时间）
     *
     * @param hpcAccountRecordId
     */
    void unBoundHpcAccountRecord(String hpcAccountRecordId);

    /**
     * 更新
     *
     * @param setCoreTimeBalance
     */
    void update(HpcAccountRecordBo setCoreTimeBalance);

    /**
     * 计算当日余额（耗时较长）
     *
     * @param recordId
     * @param date     <=
     */
    HpcAccountAmountDailyBo recordHpcBalanceByDate(String recordId, Date date);

    /**
     * 获取所有已过期的recordId
     *
     * @return
     */
    List<String> getRecordIdsByExpire();

    /**
     * 获取需要增值的账号列表
     *
     * @return
     */
    List<UserAndAccountBo> findNeedIncrease();

    /**
     * @param accountId
     * @return
     */
    List<HpcAccountUserInfoBo> findNeedRepair(List<String> accountId);

    /**
     * 刷新HpcAccount
     *
     * @param hpcAccountRecordId
     */
    void refreshHpcAccount(String hpcAccountRecordId);

    /**
     * 获取可增值的HPC-RECORD列表（不包含冻结+过期账号+无限算力）
     *
     * @return
     */
    List<HpcAccountRecordBo> listUsableHpcAccountRecordInfo();

    /**
     * 获取HpcRecord列表通过超算名称
     *
     * @param hpcName
     * @return
     */
    List<HpcAccountRecordBo> getListByHpcConfigName(String hpcName);

    /**
     * 查询所有HPC余额不足的数据
     */
    List<HpcAccountRecordBo> getInvalidHpcAccount();

    /**
     * 根据providerId查询所有相关的hpc record记录
     *
     * @param providerType
     * @return
     */
    List<HpcAccountRecordBo> listRecordByProviderType(String providerType);

    /**
     * 查询某用户指定供应商下的HPC账户列表
     *
     * @param userId       用户ID，必需
     * @param providerType 供应商类型，为空则获取所有
     * @return
     */
    List<HpcAccountBaseBO> listHpcAccountsByUser(String userId, String providerType);

}
